/**
 * 此类以 `经度` 和 `纬度` 表示的地理位置坐标点
 */
export interface LngLatOptions {
    /**
     * 地理经度
     */
    lng: number;

    /**
     * 地理纬度
     */
    lat: number
}

/**
 * 此类以 `经度` 和 `纬度` 表示的地理位置坐标点
 */
export interface LngLat {
    readonly lng: number;
    readonly lat: number;

    /**
     * 根据给定 `经度` 和 `纬度` 创建地理位置坐标点
     *
     * @param lng 经度
     *
     *  @param lat 纬度
     */
    new(lng: number, lat: number): LngLat

    /**
     * 获取地理坐标点的经度
     */
    getLng: () => number;

    /**
     * 获取地理坐标点的纬度
     */
    getLat: () => number;

    /**
     * 计算当前地理坐标点与给定坐标点之间的距离
     *
     * @param other 经纬度坐标
     */
    distanceTo: (other: LngLat) => number;

    /**
     * 判断坐标点是否相等，当且仅当两点的 `经度` 和 `纬度` 均相等时返回 `true`
     *
     * @param other 经纬度坐标
     */
    equals: (other: LngLat) => boolean
}

/**
 * 此类可以指定的坐标范围建立一个矩形区域
 */
export interface LngLatBounds {
    /**
     * 根据给定的多个地理位置坐标点创建矩形
     *
     * @param sw 矩形区域的西南角的地理位置坐标点
     *
     * @param ne 矩形区域的西南角的地理位置坐标点
     */
    new(sw: LngLat, ne: LngLat): LngLatBounds;

    /**
     * 返回西南点坐标
     */
    getSouthWest: () => LngLat;

    /**
     * 返回东北点坐标
     */
    getNorthEast: () => LngLat;

    /**
     * 返回边界的中心点坐标
     */
    getCenter: () => LngLat;

    /**
     * 放大此矩形，使其包含给定的点
     *
     * @param lnglat 点的地理坐标
     */
    extend: (lnglat: LngLat) => this;

    /**
     * 如果点的地理坐标位于此矩形内或者传入的矩形区域完全包含于此矩形区域中，则返回 `true`
     *
     * @param other 点的地理坐标或者地理范围坐标
     */
    contains: (other: LngLat | LngLatBounds) => boolean;

    /**
     * 如果矩形与给定边界相交则返回true
     *
     * @param other 地理范围坐标
     */
    intersects: (other: LngLatBounds) => boolean
}
